package com.netty.pro.netty.protobuf2;

import com.netty.pro.netty.protobuf.PeopleModel;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * @author xuzn
 * @ClassName: NettyServerHandler
 * @ProjectName netty-pro
 * @Description: 自定义一个handler, 需要继承netty规定好的某一个HandlerAdapter
 * @date 2020/3/10/14:37
 */
public class ProtobufNettyServerHandler extends SimpleChannelInboundHandler<DataInfo.AllMessage> {
  // 读取实际数据(读取客户端发送过来的消息)

  /**
   * ChannelHandlerContext:上下文对象,含有通道pipeline,管道channel和地址
   * msg:客户端发送的数据,默认是object
   *
   * @param ctx
   * @param msg
   * @throws Exception
   */
  @Override
  public void channelRead0(ChannelHandlerContext ctx, DataInfo.AllMessage msg) throws Exception {
    System.out.println(ctx.channel().hashCode());
    // 读取从客户端发送的数据
    // 拿到datatype
    DataInfo.AllMessage.DataType dataType = msg.getDataType();
    if (dataType == DataInfo.AllMessage.DataType.studentType) {
      System.out.println("客户端发送的数据:id=" +
              msg.getStudent().getId() + " 名字=" + msg.getStudent().getName());
    } else {
      System.out.println("客户端发送的数据:age=" + msg.getWoker().getAge() + " 名字=" + msg.getWoker().getName());
    }
  }

  // 数据读取完毕
  @Override
  public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    System.out.println("进入readcomplete方法");
    // 将数据写入到缓存并发送
    // 一般来讲先将数据进行编码
    ctx.writeAndFlush(Unpooled.copiedBuffer("hello client,(๑ŐдŐ)b1", CharsetUtil.UTF_8));
  }

  // 处理异常一般情况下关闭通道
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    ctx.close();
  }
}
